package com.hisense.davidmoten.rtree;

import static java.util.Collections.min;

import java.util.List;

import com.hisense.davidmoten.rtree.geometry.Geometry;
import com.hisense.davidmoten.rtree.internal.Comparators;

/**
 * 从候选节点列表中选择与其他兄弟节点的重叠面积增量最小的节点；
 * 若并列，则比较插入后的面积增量；再并列，则比较原始面积大小。
 * 该策略旨在减少节点间重叠（尤其在查询时），常用于 R*-Tree 等变体的选择过程。
 */
public final class SelectorMinimalOverlapArea implements Selector {

    /**
     * 基于待插入几何的 MBR 与候选节点集合，使用比较器按以下优先级选择：
     * 1) 重叠面积增量最小；
     * 2) 若并列，则面积增量更小；
     * 3) 若仍并列，则原始面积更小。
     * 通过减少节点间重叠，可提升范围查询与最近邻查询的性能。
     *
     * @param g 待插入的几何对象
     * @param nodes 候选节点列表
     * @return 选中的节点
     */
    @Override
    public <T, S extends Geometry> Node<T, S> select(Geometry g, List<? extends Node<T, S>> nodes) {
        // 优先减少重叠面积，再比较面积增量和原始面积
        return min(nodes,
                Comparators.overlapAreaThenAreaIncreaseThenAreaComparator(g.mbr(), nodes));
    }

}
